
//1.调试就是寻找bug的一个过程


//2.调试的基本步骤
//发现程序错误的存在>>>以隔离、消除等方式对错误进行定位>>>确定错误产生的原因>>>提出纠正错误的解决办法>>>对程序错误予以改正，重新测试



//3.Debug和Release的介绍
//Debug:通常称为调试版本，它包含调试信息，并且不做任何优化，便于程序员调试程序.在
//Reelease:称为发布版本，它往往是进行了各种优化，使得程序在代码大小和运行速度上都是最优的，以便用户很好的使用
// #include<stdio.h>
// #include<stdlib.h>
// int main()
// {
//     int i=0;
//     for(i=0;i<100;i++)
//     {
//         printf("%d ",i);
//     }
//     getchar();//运行到这里就会暂停
//     return 0;
// }
//在win中两种方法调试完之会在文件中都生成一个可执行的程序。一个Debug在文件夹（Debug版本的可执行程序），一个在Release文件夹中（Release版本的可执行程序）
//Debug版本的还能在后续继续进行调试，Release版本后续就不能进行调试了
//Release版本除了大小和速度上比Debug版本强，还会对你的程序进行一定的优化



//4.一些常用的快捷键和功能（笔记本要配合fn进行使用）
//F9:选择一个地方设置断点，代码会执行到这个地方停下来。进而配合F10,一步步调试后续的代码
//F10:逐过程，按一下走向下一步的代码。一个过程可以是一次函数的调用，或者是一个语句，但是这个语句不管是怎么进行的。一下就过去了
//F5：经常和F9搭配进行使用，按下后会直接跳到断点处。跳到的断点是一个执行逻辑下的断点，在此处的断点是一个循环，再次按就会停留咋下一层循环的断点处
//F11:逐语句：每次都执行一条语句，这个快捷键可以使我们的执行逻辑进入函数的内部，比如跳到自定义函数的内部，也就是说这个快捷键可以查看代码的细节部分
//Ctrl+F5:开始执行不调试，可以直接让程序执行起来
//Shift+F5：停止调试
//Shift+F11：当你在查看一个函数内部的细节时，按下这个快捷键可以快速的跳出


//5.调试的时候查看程序当前信息
//查看临时变量的值>>>自动窗口>>>能够显示出来你执行到的步骤上下关系的变量进出变化情况



//6.研究程序死循环的原因
// #include<stdio.h>
// int main()
// {
//     int i=0;
//     int arr[10]={0};
//     for(i=0;i<=12;i++)
//     {
//         arr[i]=0;
//         printf("呵呵\n");//这种情况在win的编译器下会出现死循环。出现的原因就是arr[12]和i的地址是同一个，当arr[12]的值变为0时刚好i的值也变为0，这就是死循环的原因
//     }
//     return 0;
// }
//造成这个死循环情况的问题要从栈区、堆区、静态区来说明

//各种区都被划分为一个一个的小单元格，每个单元格都会有一个地址，这些地址有高地址往低地址排列

//栈区的默认使用：先使用高地址的空间，再使用低地址的空间

//数组随着下标的增长，地址是由低到高的增长的

//右侧单元格代表栈区里面的内存，从左到右地址由高到低>>>|i|0|0|arr[9]|arr[8]|arr[7]|arr[6],就是因为这样，会不确定的在越界的过程中碰到i的地址造成死循环

//在不同编译器，越界的位置可能不会相同：vc6.0<=10死循环     Gcc<=11死循环    vs2013<=12死循环。也就是编译器不同，函数申请了空间，但是里面创建的各种
//变量可能会在相邻的单元格挨着，或者隔了几个单元格
//Release版本不会死循环是将代码进行了优化。像上面的这个就是将数组的定义优化到了i变量的前面。也就是能将各种变量的地址以系统认为的方式进行优化



//7.常见的coding(编码)技巧
//（1）使用assert（断言）   （2）尽量使用const（常量）   (3)养成良好的编码风格   （4）添加必要的注释   （5）避免编码的陷阱
//断言 assert()，括号里面需要放一个表达式，如果表达式为真，那么什么都不会发生，如果表达式为假，那么就会进行报错


